package com.guimin.common.genterator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;

/**
 * 使用mybatis-plus逆向工程生成数据表对应的java类
 */
public class MySQLAutoGenerator {
    public static void main(String[] args) {
        //设置作者名称
        String author = "彭某人";
        //遍历数据库表
        for (String tableName : DataTableList()) {//调用逆向生成工具
            AutoGenerator(tableName, author);
        }
    }

    //设置基础包
    private static String pgPackage = "com.guimin";

    // 设置逆向工程需要的数据库驱动
    private static String sqlDriver = "com.mysql.cj.jdbc.Driver";
    private static String sqlUrl = "jdbc:mysql://192.168.1.20:3306/guimin?useUnicode=true&characterEncoding=utf-8&useSSL=false";
    private static String sqlUsername = "gm";
    private static String sqlPassword = "123456";

    //设置逆向工程需要的数据库表名
    private static List<String> DataTableList() {
        List<String> list = new ArrayList<String>();

        list.add("user_info");

        return list;
    }

    // 设置逆向工程生成工具
    private static void AutoGenerator(String tableName, String author) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();
        //config,生成配置信息路径
        // injectionconfig,为null
        // datasource,数据源配置,l连接的数据库配置
        // strategy,策略配置，数据库中的表名和创建的包名设置
        // packageinfo,包名信息
        // template,为null
        // glovbalconfig,全局生成配置
        // tempalteengine
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java/com.guimin/") // 生成路径
                .setAuthor(author) ///设置作者
                .setIdType(IdType.AUTO) // 设置主键自增长策略
                .setFileOverride(true) // 第二次生成会把第一次生成的覆盖掉
                .setBaseResultMap(true) // 生成resultMap
                .setBaseColumnList(true) // 在xml中生成基础列
//          .setEnableCache(true) // 开启二级缓存
                .setControllerName("%sController") // 设置Controller名称
                .setOpen(false);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL).setUrl(sqlUrl)//指定数据库类型
                // .setSchemaName("public");
                .setDriverName(sqlDriver).setUsername(sqlUsername).setPassword(sqlPassword);
        mpg.setDataSource(dsc);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        //注意符号，以；结束
        strategy.setCapitalMode(true)// 开启全局大写命名
                .setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                .setColumnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略
                .setEntityLombokModel(true)// 是否为lombok模型
                .setRestControllerStyle(true) // 控制器使用 @RestController注解
                .setEntityBuilderModel(true);// 是否为构建者模型
        // 写于父类中的公共字段
        strategy.setControllerMappingHyphenStyle(true);// 映射请求路径使用驼峰转连字符
        if (tableName != null) {
            strategy.setInclude(tableName);// 需要包含的表名，允许正则表达式（与exclude二选一配置）
            mpg.setStrategy(strategy);
        }
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(pgPackage); // 基本包名
        mpg.setPackageInfo(pc);
        mpg.execute();//代码生成器提示
    }
}



